package scala.for_the.impatient

/**
  * Created by shichen on 2017/5/4.
  */

/*
本质上拥有类的所有特性，甚至可以扩展其他类或trait，
但不能提供构造器参数
对象的构造器在该对象第一次使用时调用，如果从未使用，那么构造器也不会被执行
凡是java中使用单例对象的地方，在scala中都可用对象来实现：
  存放工具函数或常量
  共享单个不可变实例
*/

object Account {
  private var lastNumber = 0 //相当于静态字段，存在在单例对象中
  def newUniqueNumber() = {lastNumber += 1; lastNumber}
}

//同时，object Account是类Account的伴生对象，可相互访问私有成员
//这是为了使类即有实例方法又有静态方法
class Account {
  val id = Account.newUniqueNumber()
  private var balance = 0.0

  def deposit(amount:Double): Unit = {
    balance += amount
  }
}

abstract class UndoableAction(val desc: String) {
  def undo(): Unit
  def redo(): Unit
}
//DoNothingAction对象可以被所有需要这个缺省行为的地方共用
object DoNothingAction extends UndoableAction("Do nothing") {
  override def undo(): Unit = {}

  override def redo(): Unit = {}
}

//apply的使用
object Account2 {
  //apply方法返回一个伴生类的对象
  def apply(init: Double): Account2 = new Account2(1, init)
}
class Account2 private(val id: Int,initialBalance: Double) {
  private var balance = initialBalance
}


//枚举使用
object TrafficLigthColor extends Enumeration {
  val red,yello,green = Value //Value调用初使化字段，相当于
  /*
  val red = Value
  val yello = Value
  val green = Value
  //每次调用Value都返回内部类的新实例，该内部类也叫做Value
   */

  val red2 = Value(0,"Stop")
  val yello2 = Value(10) //缺省名称为字段名
  val green2 = Value("Go") //枚举值自动加1
}

object ch06 {
  def main(args: Array[String]): Unit = {
    println(Account.newUniqueNumber())
  }
}

/*
//包对象，可包含方法和变量（包不能包含它们）
package object people {
  val defaultName = "cs"
}

package people {
  class Person {
    //people包可见
    private[people] def desc = "A person named " + name
    var name = defaultName
  }
}
 */